#include "adc.h"

void ADC1_Initialize_g (void)
{
   //AD1CON1 = 0x00e0; //设置为自动模式 10位4通道模式 数据右对齐  
   AD1CON1bits.ADON = 0; //bit15，ADC工作模式位，0-关闭，1-正在工作
   AD1CON1bits.ADSIDL = 0; //bit13，ADC空闲模式停止位，0-空闲模式继续工作，1-空闲模式不工作
   AD1CON1bits.ADDMABM = 0; //bit12，DMA缓冲区构建模式位，0-DMA缓冲区以分散/集中模式写入，根据模拟输入的编号和DMA缓冲区大小，模块为DMA通道提供分散/集中模式地址
                                                      // 1-DMA缓冲区以转换的顺序写入，模块位DMA通道提供一个与非DMA独立缓冲区使用的地址的相同地址
   AD1CON1bits.AD12B = 0; //bit10,10位或12位工作模式，0-十位4通道工作模式，1-12位1通道工作模式
   AD1CON1bits.FORM = 0; //bit9-8，对于10位工作模式，00-整数0000 00dd dddd dddd，01-有符号小数，ssss sssd dddd dddd，10-小数，dddd dddd dd00 0000,11-有符号小数,sddd dddd dd00 0000
                                // 对于12位工作模式，00-整数0000 dddd dddd dddd，01-有符号小数，ssss sddd dddd dddd，10-小数，dddd dddd dddd 0000,11-有符号小数,sddd dddd dddd 0000
   AD1CON1bits.SSRC = 0x07; //bit7-5,采样时钟源选择位，如果SSRCG=0
                                                    // 000-手动模式，清除SAMP结束采样开始转换
                                                    // 001-INT0激活结束采样开始转换
                                                    // 010-TMR3比较结束采样开始转换
                                                    // 011-PWM主特殊事件触发结束采样开始izhuanhuan
                                                    // 100-TMR5比较结束采样开始转换
                                                    // 101-保留
                                                    // 110-CTMU结束采样开始转换
                                                    // 111-内部计时器结束采样开始转换
                                                //如果SSRCG=1
                                                    // 000-PWM产生器1主触发时间比较结束采样开始转换
                                                    // 001-PWM产生器2主触发时间比较结束采样开始转换
                                                    // 010-PWM产生器3主触发时间比较结束采样开始转换
                                                    // 011-PTGO12主触发时间比较结束采样开始转换
                                                    // 100-PTGO13主触发时间比较结束采样开始转换
                                                    // 101-PTGO14主触发时间比较结束采样开始转换
                                                    // 110-PTGO15主触发时间比较结束采样开始转换
                                                    // 111-Reserve
   AD1CON1bits.SSRCG = 0; //bit4，采样触发源组别，参考SSRC使用
   AD1CON1bits.SIMSAM = 0; //bit3，同时采样选择位，注意，CHPS为00时不可用，AD12B=1是未实现，0-按照顺序依次采样多个通道中的每一个通道，1-同时采样CH0和CH1（CHOS=01）或同时采样CH0、CH1、CH2和CH3（CHPS=1x）
   AD1CON1bits.ASAM = 0; //bit2，ADC采样自动启动位，0-SAMP设为1开始采样，1-上一次转换结束后立即开始采样，SAMP自动置1
   AD1CON1bits.SAMP = 0; //bit1，ADC采样使能位，0-保持采样结果，1-开始采样
                            //如果ASAM=0，有软件写入1开始采样，如果ASAM=1，硬件自动置1
                            //如果SSRC=000且SSRCG=0，有软件写入0结束采样并启动转换，如果SSRC!=0，则由硬件自动清零来结束采样并启动转换
   AD1CON1bits.DONE = 0; //bit0，ADC转换状态位，如果ASAM=1，则由不需要软件清零，手动清零写0即可，0-转换未开始或进行中，1-转换周期完成
   
   
   

   //AD1CON2 = 0X0000;  
   AD1CON2bits.VCFG = 0; //bit15-13，ADC转换器参考电压配置位，000-VREFH为AVdd，VREFL为AVss
                                                         // 001-VREFH为外部VREF+，VREFL为AVss
                                                         // 010-VREFH为外部AVdd，VREFL为VREF-
                                                         // 011-外部VREF+，VREFL为VREF-
                                                         // 1xx-VREFH为AVdd，VREFL为AVss
   AD1CON2bits.CSCNA = 0; //bit10，输入扫描选择位，0-不扫描输入，1-扫描采样多路开关A选择为的CH0+输入
   AD1CON2bits.CHPS = 0; //bit9-8，通道选择位，AD12B=1时此位无效，00-转换CH0，01-转换CH0和CH1,1x-转换CH0、CH1、CH2和CH3
   AD1CON2bits.BUFS = 0; //bit7，缓冲区填充状态位，仅在BUFM=1时有效，0-正在前半部分，用户访问后半部分，1-正在访问后半部分，用户访问前半部分
   AD1CON2bits.SMPI = 0; //bit6-2，采样和转换操作位，对于具有DMA且ADDMAEN置1的器件，SMPI被称为DMA地址递增速率选择位；对于具有DMA但是ADDMAEN置0的器件，SMPI被称为每次中断采样数选择位
                            //ADDMAEN=0时
                                //00000-每完成1次采样/转换操作后产生ADC中断
                                //……
                                //01111-每完成32次采样/转换操作后产生ADC中断
                            //对于具有DMA，且ADDMAEN=1
                                //x0000-每完成1次采样/转换操作后递增DMA地址
                                //……
                                //x1111-每完成16次采样/转换操作后递增DMA地址
   AD1CON2bits.BUFM = 0; //bit1，缓冲区填充模式选择位，0-总是从起始位置开始填充，1-第一次中断发生时从缓冲区的前半部分开始填充，下一次中断发生时从缓冲区后半部分开始填充
   AD1CON2bits.ALTS = 0; //bit0，交替输入采样模式选择位，0-总是使用采样MUXA选择的输入通道，1-在第一次采样时使用采样MUXA选择的输入通道，而在下一次采样时使用采样MUXB选择的输入通道
   
   
   //AD1CON3 = 0X8000; //ADC时钟分频
   AD1CON3bits.ADRC = 1; //bit15,ADC1转换始终，0-从系统时钟分频，1-ADC内部RC时钟
   AD1CON3bits.SAMC = 0; //bit12-8，仅当SSRC=111和SSRCG=0是，此位才有用，使用一个S/H通道或使用同时采样时，SAMC至少为11111，书序采样使用多个S/H通道时，SAMC设置为00000，实现最快转换速率，自动采样时间位，00000-0Tad，……，11111-31Tad
   AD1CON3bits.ADCS = 0; //bit7-0，ADC转换时钟选择位，ADRC=1时，此位无效,Tcy*(ADCS+1)=Tad；00000000-0，……，11111111-255

   //AD1CON4 = 0X0000 ; //不使能DMA 每个通道分一个字的缓存  
   AD1CON4bits.ADDMAEN = 0; //bit8，ADC DMA使能位，清零之后则ADDMABM和DMABL将不起作用；0-不使用DMA，采用ADC1BUF0……ADC1BUFF这16个缓冲单元存储转换结果，1-采用DMA，转换结果存储进入ADC1BUF0，通过DMA传输到RAM中
   AD1CON4bits.DMABL = 0; //bit2-0，选择每个模拟输入的DMA缓冲单元数量的位，000-为每个模拟输入分配1字缓冲区，001-为每个模拟输入分配2字缓冲区，……，111为每个模拟输入分配2^7=128字缓冲区
   
    
   //AD1CHS123 = 0X0000;
   //AD12B=0时，AD1CHS123无效
   //OPMODE=1则OAx输入被使用
   AD1CHS123bits.CH123NB = 0; //bit10-9，采用多路开关B的通道1、2和3的反相输入选择位
                                //0x-CH1、CH2和CH3均为VREFL
                                //10-CH1为OA3/AN6，CH2为AN7，CH3为AN8
                                //11-CH1为AN9，CH2为AN10，CH3为AN11
   AD1CHS123bits.CH123SB = 0; //bit8,采用多路开关B的通道1、2和3的同相输入选择位
                                //0-CH1为OA1/AN3，CH2为OA2/AN0，CH3为OA3/AN6
                                //1-CH1为OA2/AN0，CH2为AN1，CH3为AN2
   AD1CHS123bits.CH123NA = 0; //bit2-1，采用多路开关A的通道1、2和3的反相输入选择位
                                //0x-CH1、CH2和CH3均为VREFL
                                //10-CH1为OA3/AN6，CH2为AN7，CH3为AN8
                                //11-CH1为AN9，CH2为AN10，CH3为AN11
   AD1CHS123bits.CH123SA = 0; //bit0，采用多路开关A的通道1、2和3的同相输入选择位
                                //0-CH1为OA1/AN3，CH2为OA2/AN0，CH3为OA3/AN6
                                //1-CH1为OA2/AN0，CH2为AN1，CH3为AN2
   

   //AD1CHS0 = 0X0000;
   AD1CHS0bits.CH0NB = 0; //bit15，采用多路开关B的通道0的反相输入选择位,0-CH0为VREFL，1-CH0为AN1
   AD1CHS0bits.CH0SB = 0; //bit12-8，采用多路开关B的通道0的同相输入选择位
                                //00000-CH0选择AN0
                                //……
                                //01101-CH0选择AN15
                                //10000-Reserve
                                //……
                                //10111-Reserve
                                //11000-CH0选择OA1/AN3
                                //11010-CH0选择OA2/AN0
                                //11010-CH0选择OA3/AN6
                                //11011-Reserve
                                //11100-Reserve
                                //11101-Reserve
                                //11110-CH0连接到CTMU温度测量
                                //11111-Open；使用CTMU电容和时间测量（CTMU TEMP）
   AD1CHS0bits.CH0NA = 0; //bit7,采用多路开关A的通道0的反相输入选择位,0-CH0为VREFL，1-CH0为AN1
   AD1CHS0bits.CH0SA = 1; //bit4-0，采用多路开关B的通道0的同相输入选择位
                                //00000-CH0选择AN0
                                //……
                                //01101-CH0选择AN15
                                //10000-Reserve
                                //……
                                //10111-Reserve
                                //11000-CH0选择OA1/AN3
                                //11010-CH0选择OA2/AN0
                                //11010-CH0选择OA3/AN6
                                //11011-Reserve
                                //11100-Reserve
                                //11101-Reserve
                                //11110-CH0连接到CTMU温度测量
                                //11111-Open；使用CTMU电容和时间测量（CTMU TEMP）
   

   //AD1CSSH = 0X0000;
   AD1CSSHbits.CSS31 = 0; //bit15,ADC1输入扫描选择位，Open，0-跳过CTMU，1-选择CTMU
   AD1CSSHbits.CSS30 = 0; //bit14,ADC1输入扫描选择位，CTMU TEMP，0-跳过CTMU，1-选择CTMU
   AD1CSSHbits.CSS26 = 0; //bit10,ADC1输入扫描选择位，0-跳过OA3/AN6,1-选择OA3/AN6
   AD1CSSHbits.CSS25 = 0; //bit9,ADC1输入扫描选择位，0-跳过OA2/AN0,1-选择OA2/AN0
   AD1CSSHbits.CSS24 = 0; //bit8,ADC1输入扫描选择位，0-跳过OA1/AN3,1-选择OA1/AN3
   
   
   //AD1CSSL = 0X0000; 
   AD1CSSLbits.CSS15 = 0; //bit15,ADC1输入扫描选择位，0-跳过AN15,1-选择AN15
   AD1CSSLbits.CSS14 = 0; //bit14,ADC1输入扫描选择位，0-跳过AN14,1-选择AN14
   AD1CSSLbits.CSS13 = 0; //bit13,ADC1输入扫描选择位，0-跳过AN13,1-选择AN13
   AD1CSSLbits.CSS12 = 0; //bit12,ADC1输入扫描选择位，0-跳过AN12,1-选择AN12
   AD1CSSLbits.CSS11 = 0; //bit11,ADC1输入扫描选择位，0-跳过AN11,1-选择AN11
   AD1CSSLbits.CSS10 = 0; //bit10,ADC1输入扫描选择位，0-跳过AN10,1-选择AN10
   AD1CSSLbits.CSS9 = 0; //bit9,ADC1输入扫描选择位，0-跳过AN9,1-选择AN9
   AD1CSSLbits.CSS8 = 0; //bit8,ADC1输入扫描选择位，0-跳过AN8,1-选择AN87
   AD1CSSLbits.CSS7 = 0; //bit7,ADC1输入扫描选择位，0-跳过AN7,1-选择AN7
   AD1CSSLbits.CSS6 = 0; //bit6,ADC1输入扫描选择位，0-跳过AN6,1-选择AN6
   AD1CSSLbits.CSS5 = 0; //bit5,ADC1输入扫描选择位，0-跳过AN5,1-选择AN5
   AD1CSSLbits.CSS4 = 0; //bit4,ADC1输入扫描选择位，0-跳过AN4,1-选择AN4
   AD1CSSLbits.CSS3 = 0; //bit3,ADC1输入扫描选择位，0-跳过AN3,1-选择AN3
   AD1CSSLbits.CSS2 = 0; //bit2,ADC1输入扫描选择位，0-跳过AN2,1-选择AN2
   AD1CSSLbits.CSS1 = 0; //bit1,ADC1输入扫描选择位，0-跳过AN1,1-选择AN1
   AD1CSSLbits.CSS0 = 0; //bit0,ADC1输入扫描选择位，0-跳过AN0,1-选择AN0

   AD1CON1bits.ADON = 0x0001 ; //开启ADC模块工作  
//    asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时  
//    asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;  
}

uint16_t AdcSwitch(uint16_t channel) //  ADRESH ADRESL  
{  
    uint16_t wTmp ;  
    //AD1CON1bits.ADON = 0x0001 ; //开启ADC模块工作  
   
    AD1CHS0 = (AD1CHS0 & 0XFFE0)|channel ;//选择通道  
   
    asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时  
    asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;  
   
    //AD1CON1 &= ~0x0001 ; //ADC空闲  
    AD1CON2bits.ALTS = 0x0001;
    AD1CON1bits.SAMP = 0x0001 ; //开始转换  
   
    while(!AD1CON1bits.DONE) ; //等待转换完成  
//  AD1CON1 &= ~DONE ; //ADC空闲  
   
    wTmp = ADC1BUF0 & 0X03FF ; //读取转换结果  
   
    return wTmp ;  
}  